{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import datetime\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Destroy the current tensorflow graph and session and creates a new one\n",
    "\n",
    "tf.keras.backend.clear_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [],
   "source": [
    "spine_data = pd.read_csv(\"Dataset_spine.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Col1</th>\n",
       "      <th>Col2</th>\n",
       "      <th>Col3</th>\n",
       "      <th>Col4</th>\n",
       "      <th>Col5</th>\n",
       "      <th>Col6</th>\n",
       "      <th>Col7</th>\n",
       "      <th>Col8</th>\n",
       "      <th>Col9</th>\n",
       "      <th>Col10</th>\n",
       "      <th>Col11</th>\n",
       "      <th>Col12</th>\n",
       "      <th>Class_att</th>\n",
       "      <th>Unnamed: 13</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>63.027818</td>\n",
       "      <td>22.552586</td>\n",
       "      <td>39.609117</td>\n",
       "      <td>40.475232</td>\n",
       "      <td>98.672917</td>\n",
       "      <td>-0.254400</td>\n",
       "      <td>0.744503</td>\n",
       "      <td>12.5661</td>\n",
       "      <td>14.5386</td>\n",
       "      <td>15.30468</td>\n",
       "      <td>-28.658501</td>\n",
       "      <td>43.5123</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>39.056951</td>\n",
       "      <td>10.060991</td>\n",
       "      <td>25.015378</td>\n",
       "      <td>28.995960</td>\n",
       "      <td>114.405425</td>\n",
       "      <td>4.564259</td>\n",
       "      <td>0.415186</td>\n",
       "      <td>12.8874</td>\n",
       "      <td>17.5323</td>\n",
       "      <td>16.78486</td>\n",
       "      <td>-25.530607</td>\n",
       "      <td>16.1102</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>68.832021</td>\n",
       "      <td>22.218482</td>\n",
       "      <td>50.092194</td>\n",
       "      <td>46.613539</td>\n",
       "      <td>105.985135</td>\n",
       "      <td>-3.530317</td>\n",
       "      <td>0.474889</td>\n",
       "      <td>26.8343</td>\n",
       "      <td>17.4861</td>\n",
       "      <td>16.65897</td>\n",
       "      <td>-29.031888</td>\n",
       "      <td>19.2221</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>Prediction is done by using binary classificat...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>69.297008</td>\n",
       "      <td>24.652878</td>\n",
       "      <td>44.311238</td>\n",
       "      <td>44.644130</td>\n",
       "      <td>101.868495</td>\n",
       "      <td>11.211523</td>\n",
       "      <td>0.369345</td>\n",
       "      <td>23.5603</td>\n",
       "      <td>12.7074</td>\n",
       "      <td>11.42447</td>\n",
       "      <td>-30.470246</td>\n",
       "      <td>18.8329</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>49.712859</td>\n",
       "      <td>9.652075</td>\n",
       "      <td>28.317406</td>\n",
       "      <td>40.060784</td>\n",
       "      <td>108.168725</td>\n",
       "      <td>7.918501</td>\n",
       "      <td>0.543360</td>\n",
       "      <td>35.4940</td>\n",
       "      <td>15.9546</td>\n",
       "      <td>8.87237</td>\n",
       "      <td>-16.378376</td>\n",
       "      <td>24.9171</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Col1       Col2       Col3       Col4        Col5       Col6  \\\n",
       "0  63.027818  22.552586  39.609117  40.475232   98.672917  -0.254400   \n",
       "1  39.056951  10.060991  25.015378  28.995960  114.405425   4.564259   \n",
       "2  68.832021  22.218482  50.092194  46.613539  105.985135  -3.530317   \n",
       "3  69.297008  24.652878  44.311238  44.644130  101.868495  11.211523   \n",
       "4  49.712859   9.652075  28.317406  40.060784  108.168725   7.918501   \n",
       "\n",
       "       Col7     Col8     Col9     Col10      Col11    Col12 Class_att  \\\n",
       "0  0.744503  12.5661  14.5386  15.30468 -28.658501  43.5123  Abnormal   \n",
       "1  0.415186  12.8874  17.5323  16.78486 -25.530607  16.1102  Abnormal   \n",
       "2  0.474889  26.8343  17.4861  16.65897 -29.031888  19.2221  Abnormal   \n",
       "3  0.369345  23.5603  12.7074  11.42447 -30.470246  18.8329  Abnormal   \n",
       "4  0.543360  35.4940  15.9546   8.87237 -16.378376  24.9171  Abnormal   \n",
       "\n",
       "                                         Unnamed: 13  \n",
       "0                                                NaN  \n",
       "1                                                NaN  \n",
       "2  Prediction is done by using binary classificat...  \n",
       "3                                                NaN  \n",
       "4                                                NaN  "
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 13</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Prediction is done by using binary classificat...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         Unnamed: 13\n",
       "0                                                NaN\n",
       "1                                                NaN\n",
       "2  Prediction is done by using binary classificat...\n",
       "3                                                NaN\n",
       "4                                                NaN"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.iloc[:,-1:].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "# removing Unnecessary column\n",
    "del spine_data[\"Unnamed: 13\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "spine_data.rename(columns = {\n",
    "    \"Col1\" : \"pelvic_incidence\", \n",
    "    \"Col2\" : \"pelvic_tilt\",\n",
    "    \"Col3\" : \"lumbar_lordosis_angle\",\n",
    "    \"Col4\" : \"sacral_slope\", \n",
    "    \"Col5\" : \"pelvic_radius\",\n",
    "    \"Col6\" : \"degree_spondylolisthesis\", \n",
    "    \"Col7\" : \"pelvic_slope\",\n",
    "    \"Col8\" : \"direct_tilt\",\n",
    "    \"Col9\" : \"thoracic_slope\", \n",
    "    \"Col10\" :\"cervical_tilt\", \n",
    "    \"Col11\" : \"sacrum_angle\",\n",
    "    \"Col12\" : \"scoliosis_slope\", \n",
    "    \"Class_att\" : \"class_att\"}, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pelvic_incidence</th>\n",
       "      <th>pelvic_tilt</th>\n",
       "      <th>lumbar_lordosis_angle</th>\n",
       "      <th>sacral_slope</th>\n",
       "      <th>pelvic_radius</th>\n",
       "      <th>degree_spondylolisthesis</th>\n",
       "      <th>pelvic_slope</th>\n",
       "      <th>direct_tilt</th>\n",
       "      <th>thoracic_slope</th>\n",
       "      <th>cervical_tilt</th>\n",
       "      <th>sacrum_angle</th>\n",
       "      <th>scoliosis_slope</th>\n",
       "      <th>class_att</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>63.027818</td>\n",
       "      <td>22.552586</td>\n",
       "      <td>39.609117</td>\n",
       "      <td>40.475232</td>\n",
       "      <td>98.672917</td>\n",
       "      <td>-0.254400</td>\n",
       "      <td>0.744503</td>\n",
       "      <td>12.5661</td>\n",
       "      <td>14.5386</td>\n",
       "      <td>15.30468</td>\n",
       "      <td>-28.658501</td>\n",
       "      <td>43.5123</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>39.056951</td>\n",
       "      <td>10.060991</td>\n",
       "      <td>25.015378</td>\n",
       "      <td>28.995960</td>\n",
       "      <td>114.405425</td>\n",
       "      <td>4.564259</td>\n",
       "      <td>0.415186</td>\n",
       "      <td>12.8874</td>\n",
       "      <td>17.5323</td>\n",
       "      <td>16.78486</td>\n",
       "      <td>-25.530607</td>\n",
       "      <td>16.1102</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>68.832021</td>\n",
       "      <td>22.218482</td>\n",
       "      <td>50.092194</td>\n",
       "      <td>46.613539</td>\n",
       "      <td>105.985135</td>\n",
       "      <td>-3.530317</td>\n",
       "      <td>0.474889</td>\n",
       "      <td>26.8343</td>\n",
       "      <td>17.4861</td>\n",
       "      <td>16.65897</td>\n",
       "      <td>-29.031888</td>\n",
       "      <td>19.2221</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>69.297008</td>\n",
       "      <td>24.652878</td>\n",
       "      <td>44.311238</td>\n",
       "      <td>44.644130</td>\n",
       "      <td>101.868495</td>\n",
       "      <td>11.211523</td>\n",
       "      <td>0.369345</td>\n",
       "      <td>23.5603</td>\n",
       "      <td>12.7074</td>\n",
       "      <td>11.42447</td>\n",
       "      <td>-30.470246</td>\n",
       "      <td>18.8329</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>49.712859</td>\n",
       "      <td>9.652075</td>\n",
       "      <td>28.317406</td>\n",
       "      <td>40.060784</td>\n",
       "      <td>108.168725</td>\n",
       "      <td>7.918501</td>\n",
       "      <td>0.543360</td>\n",
       "      <td>35.4940</td>\n",
       "      <td>15.9546</td>\n",
       "      <td>8.87237</td>\n",
       "      <td>-16.378376</td>\n",
       "      <td>24.9171</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pelvic_incidence  pelvic_tilt  lumbar_lordosis_angle  sacral_slope  \\\n",
       "0         63.027818    22.552586              39.609117     40.475232   \n",
       "1         39.056951    10.060991              25.015378     28.995960   \n",
       "2         68.832021    22.218482              50.092194     46.613539   \n",
       "3         69.297008    24.652878              44.311238     44.644130   \n",
       "4         49.712859     9.652075              28.317406     40.060784   \n",
       "\n",
       "   pelvic_radius  degree_spondylolisthesis  pelvic_slope  direct_tilt  \\\n",
       "0      98.672917                 -0.254400      0.744503      12.5661   \n",
       "1     114.405425                  4.564259      0.415186      12.8874   \n",
       "2     105.985135                 -3.530317      0.474889      26.8343   \n",
       "3     101.868495                 11.211523      0.369345      23.5603   \n",
       "4     108.168725                  7.918501      0.543360      35.4940   \n",
       "\n",
       "   thoracic_slope  cervical_tilt  sacrum_angle  scoliosis_slope class_att  \n",
       "0         14.5386       15.30468    -28.658501          43.5123  Abnormal  \n",
       "1         17.5323       16.78486    -25.530607          16.1102  Abnormal  \n",
       "2         17.4861       16.65897    -29.031888          19.2221  Abnormal  \n",
       "3         12.7074       11.42447    -30.470246          18.8329  Abnormal  \n",
       "4         15.9546        8.87237    -16.378376          24.9171  Abnormal  "
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(310, 13)"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>pelvic_incidence</th>\n",
       "      <td>63.0278</td>\n",
       "      <td>39.057</td>\n",
       "      <td>68.832</td>\n",
       "      <td>69.297</td>\n",
       "      <td>49.7129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_tilt</th>\n",
       "      <td>22.5526</td>\n",
       "      <td>10.061</td>\n",
       "      <td>22.2185</td>\n",
       "      <td>24.6529</td>\n",
       "      <td>9.65207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>lumbar_lordosis_angle</th>\n",
       "      <td>39.6091</td>\n",
       "      <td>25.0154</td>\n",
       "      <td>50.0922</td>\n",
       "      <td>44.3112</td>\n",
       "      <td>28.3174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacral_slope</th>\n",
       "      <td>40.4752</td>\n",
       "      <td>28.996</td>\n",
       "      <td>46.6135</td>\n",
       "      <td>44.6441</td>\n",
       "      <td>40.0608</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_radius</th>\n",
       "      <td>98.6729</td>\n",
       "      <td>114.405</td>\n",
       "      <td>105.985</td>\n",
       "      <td>101.868</td>\n",
       "      <td>108.169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>degree_spondylolisthesis</th>\n",
       "      <td>-0.2544</td>\n",
       "      <td>4.56426</td>\n",
       "      <td>-3.53032</td>\n",
       "      <td>11.2115</td>\n",
       "      <td>7.9185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_slope</th>\n",
       "      <td>0.744503</td>\n",
       "      <td>0.415186</td>\n",
       "      <td>0.474889</td>\n",
       "      <td>0.369345</td>\n",
       "      <td>0.54336</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>direct_tilt</th>\n",
       "      <td>12.5661</td>\n",
       "      <td>12.8874</td>\n",
       "      <td>26.8343</td>\n",
       "      <td>23.5603</td>\n",
       "      <td>35.494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>thoracic_slope</th>\n",
       "      <td>14.5386</td>\n",
       "      <td>17.5323</td>\n",
       "      <td>17.4861</td>\n",
       "      <td>12.7074</td>\n",
       "      <td>15.9546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cervical_tilt</th>\n",
       "      <td>15.3047</td>\n",
       "      <td>16.7849</td>\n",
       "      <td>16.659</td>\n",
       "      <td>11.4245</td>\n",
       "      <td>8.87237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacrum_angle</th>\n",
       "      <td>-28.6585</td>\n",
       "      <td>-25.5306</td>\n",
       "      <td>-29.0319</td>\n",
       "      <td>-30.4702</td>\n",
       "      <td>-16.3784</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>scoliosis_slope</th>\n",
       "      <td>43.5123</td>\n",
       "      <td>16.1102</td>\n",
       "      <td>19.2221</td>\n",
       "      <td>18.8329</td>\n",
       "      <td>24.9171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>class_att</th>\n",
       "      <td>Abnormal</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>Abnormal</td>\n",
       "      <td>Abnormal</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 0         1         2         3         4\n",
       "pelvic_incidence           63.0278    39.057    68.832    69.297   49.7129\n",
       "pelvic_tilt                22.5526    10.061   22.2185   24.6529   9.65207\n",
       "lumbar_lordosis_angle      39.6091   25.0154   50.0922   44.3112   28.3174\n",
       "sacral_slope               40.4752    28.996   46.6135   44.6441   40.0608\n",
       "pelvic_radius              98.6729   114.405   105.985   101.868   108.169\n",
       "degree_spondylolisthesis   -0.2544   4.56426  -3.53032   11.2115    7.9185\n",
       "pelvic_slope              0.744503  0.415186  0.474889  0.369345   0.54336\n",
       "direct_tilt                12.5661   12.8874   26.8343   23.5603    35.494\n",
       "thoracic_slope             14.5386   17.5323   17.4861   12.7074   15.9546\n",
       "cervical_tilt              15.3047   16.7849    16.659   11.4245   8.87237\n",
       "sacrum_angle              -28.6585  -25.5306  -29.0319  -30.4702  -16.3784\n",
       "scoliosis_slope            43.5123   16.1102   19.2221   18.8329   24.9171\n",
       "class_att                 Abnormal  Abnormal  Abnormal  Abnormal  Abnormal"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.head().T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['pelvic_incidence', 'pelvic_tilt', 'lumbar_lordosis_angle',\n",
       "       'sacral_slope', 'pelvic_radius', 'degree_spondylolisthesis',\n",
       "       'pelvic_slope', 'direct_tilt', 'thoracic_slope', 'cervical_tilt',\n",
       "       'sacrum_angle', 'scoliosis_slope', 'class_att'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Abnormal', 'Normal'], dtype=object)"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data['class_att'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>25%</th>\n",
       "      <th>50%</th>\n",
       "      <th>75%</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>pelvic_incidence</th>\n",
       "      <td>310.0</td>\n",
       "      <td>60.496653</td>\n",
       "      <td>17.236520</td>\n",
       "      <td>26.147921</td>\n",
       "      <td>46.430294</td>\n",
       "      <td>58.691038</td>\n",
       "      <td>72.877696</td>\n",
       "      <td>129.834041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>17.542822</td>\n",
       "      <td>10.008330</td>\n",
       "      <td>-6.554948</td>\n",
       "      <td>10.667069</td>\n",
       "      <td>16.357689</td>\n",
       "      <td>22.120395</td>\n",
       "      <td>49.431864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>lumbar_lordosis_angle</th>\n",
       "      <td>310.0</td>\n",
       "      <td>51.930930</td>\n",
       "      <td>18.554064</td>\n",
       "      <td>14.000000</td>\n",
       "      <td>37.000000</td>\n",
       "      <td>49.562398</td>\n",
       "      <td>63.000000</td>\n",
       "      <td>125.742385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacral_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>42.953831</td>\n",
       "      <td>13.423102</td>\n",
       "      <td>13.366931</td>\n",
       "      <td>33.347122</td>\n",
       "      <td>42.404912</td>\n",
       "      <td>52.695888</td>\n",
       "      <td>121.429566</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_radius</th>\n",
       "      <td>310.0</td>\n",
       "      <td>117.920655</td>\n",
       "      <td>13.317377</td>\n",
       "      <td>70.082575</td>\n",
       "      <td>110.709196</td>\n",
       "      <td>118.268178</td>\n",
       "      <td>125.467674</td>\n",
       "      <td>163.071041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>degree_spondylolisthesis</th>\n",
       "      <td>310.0</td>\n",
       "      <td>26.296694</td>\n",
       "      <td>37.559027</td>\n",
       "      <td>-11.058179</td>\n",
       "      <td>1.603727</td>\n",
       "      <td>11.767934</td>\n",
       "      <td>41.287352</td>\n",
       "      <td>418.543082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>0.472979</td>\n",
       "      <td>0.285787</td>\n",
       "      <td>0.003220</td>\n",
       "      <td>0.224367</td>\n",
       "      <td>0.475989</td>\n",
       "      <td>0.704846</td>\n",
       "      <td>0.998827</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>direct_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>21.321526</td>\n",
       "      <td>8.639423</td>\n",
       "      <td>7.027000</td>\n",
       "      <td>13.054400</td>\n",
       "      <td>21.907150</td>\n",
       "      <td>28.954075</td>\n",
       "      <td>36.743900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>thoracic_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>13.064511</td>\n",
       "      <td>3.399713</td>\n",
       "      <td>7.037800</td>\n",
       "      <td>10.417800</td>\n",
       "      <td>12.938450</td>\n",
       "      <td>15.889525</td>\n",
       "      <td>19.324000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cervical_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>11.933317</td>\n",
       "      <td>2.893265</td>\n",
       "      <td>7.030600</td>\n",
       "      <td>9.541140</td>\n",
       "      <td>11.953835</td>\n",
       "      <td>14.371810</td>\n",
       "      <td>16.821080</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacrum_angle</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-14.053139</td>\n",
       "      <td>12.225582</td>\n",
       "      <td>-35.287375</td>\n",
       "      <td>-24.289522</td>\n",
       "      <td>-14.622856</td>\n",
       "      <td>-3.497094</td>\n",
       "      <td>6.972071</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>scoliosis_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>25.645981</td>\n",
       "      <td>10.450558</td>\n",
       "      <td>7.007900</td>\n",
       "      <td>17.189075</td>\n",
       "      <td>24.931950</td>\n",
       "      <td>33.979600</td>\n",
       "      <td>44.341200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          count        mean        std        min         25%  \\\n",
       "pelvic_incidence          310.0   60.496653  17.236520  26.147921   46.430294   \n",
       "pelvic_tilt               310.0   17.542822  10.008330  -6.554948   10.667069   \n",
       "lumbar_lordosis_angle     310.0   51.930930  18.554064  14.000000   37.000000   \n",
       "sacral_slope              310.0   42.953831  13.423102  13.366931   33.347122   \n",
       "pelvic_radius             310.0  117.920655  13.317377  70.082575  110.709196   \n",
       "degree_spondylolisthesis  310.0   26.296694  37.559027 -11.058179    1.603727   \n",
       "pelvic_slope              310.0    0.472979   0.285787   0.003220    0.224367   \n",
       "direct_tilt               310.0   21.321526   8.639423   7.027000   13.054400   \n",
       "thoracic_slope            310.0   13.064511   3.399713   7.037800   10.417800   \n",
       "cervical_tilt             310.0   11.933317   2.893265   7.030600    9.541140   \n",
       "sacrum_angle              310.0  -14.053139  12.225582 -35.287375  -24.289522   \n",
       "scoliosis_slope           310.0   25.645981  10.450558   7.007900   17.189075   \n",
       "\n",
       "                                 50%         75%         max  \n",
       "pelvic_incidence           58.691038   72.877696  129.834041  \n",
       "pelvic_tilt                16.357689   22.120395   49.431864  \n",
       "lumbar_lordosis_angle      49.562398   63.000000  125.742385  \n",
       "sacral_slope               42.404912   52.695888  121.429566  \n",
       "pelvic_radius             118.268178  125.467674  163.071041  \n",
       "degree_spondylolisthesis   11.767934   41.287352  418.543082  \n",
       "pelvic_slope                0.475989    0.704846    0.998827  \n",
       "direct_tilt                21.907150   28.954075   36.743900  \n",
       "thoracic_slope             12.938450   15.889525   19.324000  \n",
       "cervical_tilt              11.953835   14.371810   16.821080  \n",
       "sacrum_angle              -14.622856   -3.497094    6.972071  \n",
       "scoliosis_slope            24.931950   33.979600   44.341200  "
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spine_data.describe().transpose()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (8,6))\n",
    "\n",
    "sns.countplot('class_att', data = spine_data)\n",
    "\n",
    "plt.xlabel(\"Class_att\", fontsize = 20)\n",
    "plt.ylabel('Count', fontsize = 20)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (8,6))\n",
    "\n",
    "sns.boxplot('class_att', 'pelvic_radius', data = spine_data)\n",
    "\n",
    "plt.xlabel(\"Class_att\", fontsize = 20)\n",
    "plt.ylabel('Pelvic_Radius', fontsize = 20)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>class_att</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>273</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>246</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>143</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>257</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>172</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>244</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     class_att\n",
       "52           0\n",
       "273          1\n",
       "246          1\n",
       "68           0\n",
       "143          0\n",
       "111          0\n",
       "257          1\n",
       "122          0\n",
       "172          0\n",
       "244          1"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_att = {'Abnormal':0, 'Normal':1}\n",
    "\n",
    "spine_data['class_att'].replace(class_att, inplace = True)\n",
    "\n",
    "spine_data[['class_att']].sample(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = spine_data.drop('class_att', axis = 1)\n",
    "target = spine_data[['class_att']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>25%</th>\n",
       "      <th>50%</th>\n",
       "      <th>75%</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>pelvic_incidence</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-2.141656e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.996010</td>\n",
       "      <td>-0.817398</td>\n",
       "      <td>-0.104925</td>\n",
       "      <td>0.719464</td>\n",
       "      <td>4.029206</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>1.568638e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-2.411664</td>\n",
       "      <td>-0.688114</td>\n",
       "      <td>-0.118606</td>\n",
       "      <td>0.458116</td>\n",
       "      <td>3.191402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>lumbar_lordosis_angle</th>\n",
       "      <td>310.0</td>\n",
       "      <td>3.527644e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-2.047652</td>\n",
       "      <td>-0.806027</td>\n",
       "      <td>-0.127862</td>\n",
       "      <td>0.597549</td>\n",
       "      <td>3.984615</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacral_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-1.719055e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-2.207741</td>\n",
       "      <td>-0.716842</td>\n",
       "      <td>-0.040960</td>\n",
       "      <td>0.726941</td>\n",
       "      <td>5.855771</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_radius</th>\n",
       "      <td>310.0</td>\n",
       "      <td>4.548333e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-3.597963</td>\n",
       "      <td>-0.542383</td>\n",
       "      <td>0.026138</td>\n",
       "      <td>0.567621</td>\n",
       "      <td>3.395818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>degree_spondylolisthesis</th>\n",
       "      <td>310.0</td>\n",
       "      <td>9.060852e-17</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-0.996172</td>\n",
       "      <td>-0.658507</td>\n",
       "      <td>-0.387450</td>\n",
       "      <td>0.399768</td>\n",
       "      <td>10.460350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pelvic_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>1.074409e-17</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.646397</td>\n",
       "      <td>-0.871329</td>\n",
       "      <td>0.010547</td>\n",
       "      <td>0.812640</td>\n",
       "      <td>1.842974</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>direct_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>6.437503e-17</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.657245</td>\n",
       "      <td>-0.958454</td>\n",
       "      <td>0.067895</td>\n",
       "      <td>0.884884</td>\n",
       "      <td>1.788002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>thoracic_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>2.442491e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.775578</td>\n",
       "      <td>-0.779769</td>\n",
       "      <td>-0.037140</td>\n",
       "      <td>0.832300</td>\n",
       "      <td>1.844158</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cervical_tilt</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-3.875036e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.697267</td>\n",
       "      <td>-0.828145</td>\n",
       "      <td>0.007103</td>\n",
       "      <td>0.844180</td>\n",
       "      <td>1.692090</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sacrum_angle</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-7.664120e-17</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.739677</td>\n",
       "      <td>-0.838646</td>\n",
       "      <td>-0.046676</td>\n",
       "      <td>0.864835</td>\n",
       "      <td>1.722552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>scoliosis_slope</th>\n",
       "      <td>310.0</td>\n",
       "      <td>-1.231989e-16</td>\n",
       "      <td>1.001617</td>\n",
       "      <td>-1.786337</td>\n",
       "      <td>-0.810538</td>\n",
       "      <td>-0.068435</td>\n",
       "      <td>0.798722</td>\n",
       "      <td>1.791813</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          count          mean       std       min       25%  \\\n",
       "pelvic_incidence          310.0 -2.141656e-16  1.001617 -1.996010 -0.817398   \n",
       "pelvic_tilt               310.0  1.568638e-16  1.001617 -2.411664 -0.688114   \n",
       "lumbar_lordosis_angle     310.0  3.527644e-16  1.001617 -2.047652 -0.806027   \n",
       "sacral_slope              310.0 -1.719055e-16  1.001617 -2.207741 -0.716842   \n",
       "pelvic_radius             310.0  4.548333e-16  1.001617 -3.597963 -0.542383   \n",
       "degree_spondylolisthesis  310.0  9.060852e-17  1.001617 -0.996172 -0.658507   \n",
       "pelvic_slope              310.0  1.074409e-17  1.001617 -1.646397 -0.871329   \n",
       "direct_tilt               310.0  6.437503e-17  1.001617 -1.657245 -0.958454   \n",
       "thoracic_slope            310.0  2.442491e-16  1.001617 -1.775578 -0.779769   \n",
       "cervical_tilt             310.0 -3.875036e-16  1.001617 -1.697267 -0.828145   \n",
       "sacrum_angle              310.0 -7.664120e-17  1.001617 -1.739677 -0.838646   \n",
       "scoliosis_slope           310.0 -1.231989e-16  1.001617 -1.786337 -0.810538   \n",
       "\n",
       "                               50%       75%        max  \n",
       "pelvic_incidence         -0.104925  0.719464   4.029206  \n",
       "pelvic_tilt              -0.118606  0.458116   3.191402  \n",
       "lumbar_lordosis_angle    -0.127862  0.597549   3.984615  \n",
       "sacral_slope             -0.040960  0.726941   5.855771  \n",
       "pelvic_radius             0.026138  0.567621   3.395818  \n",
       "degree_spondylolisthesis -0.387450  0.399768  10.460350  \n",
       "pelvic_slope              0.010547  0.812640   1.842974  \n",
       "direct_tilt               0.067895  0.884884   1.788002  \n",
       "thoracic_slope           -0.037140  0.832300   1.844158  \n",
       "cervical_tilt             0.007103  0.844180   1.692090  \n",
       "sacrum_angle             -0.046676  0.864835   1.722552  \n",
       "scoliosis_slope          -0.068435  0.798722   1.791813  "
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sc = StandardScaler()\n",
    "\n",
    "scaled_features = pd.DataFrame(sc.fit_transform(features), columns = features.columns, index = features.index)\n",
    "\n",
    "scaled_features.describe().T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(310, 12)"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scaled_features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train,x_test,y_train,y_test = train_test_split(scaled_features, target, test_size = 0.15, random_state = 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((263, 12), (47, 12))"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, x_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,x_val,y_train,y_val = train_test_split(x_train, y_train, test_size = 0.15, random_state = 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((223, 12), (40, 12), (47, 12))"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, x_val.shape, x_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((223, 1), (40, 1), (47, 1))"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.shape, y_val.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**keras Funtional API(Application Programing Interface)**: The keras Functional API is a way to create models that are more flexible than Sequential models - models can have non_linear topology, shared layers, multiple inputs and outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_and_compile_model():\n",
    "    \n",
    "    inputs = tf.keras.Input(shape = (x_train.shape[1],))\n",
    "    \n",
    "    x = layers.Dense(16, activation = 'relu')(inputs)\n",
    "    \n",
    "    x = layers.Dropout(0.3)(x)\n",
    "    \n",
    "    x = layers.Dense(8, activation = 'relu')(x)\n",
    "    \n",
    "    predictions = layers.Dense(1, activation = 'sigmoid')(x)\n",
    "    \n",
    "    model = tf.keras.Model(inputs = inputs, outputs = predictions)\n",
    "    \n",
    "    model.summary()\n",
    "    \n",
    "    optimizer = tf.keras.optimizers.RMSprop(lr = 0.001)\n",
    "    \n",
    "    model.compile(optimizer = optimizer, loss = tf.keras.losses.BinaryCrossentropy(),\n",
    "                 metrics = ['accuracy', tf.keras.metrics.Precision(0.5),\n",
    "                           tf.keras.metrics.Recall(0.5),])\n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Every layer instance is a callable, accepts inputs and returns a tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"functional_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         [(None, 12)]              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 16)                208       \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 8)                 136       \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 353\n",
      "Trainable params: 353\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = build_and_compile_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [],
   "source": [
    "# keras.utils.plot_model(model,'model_classificatin_shapes.png',show_shapes = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<ShuffleDataset shapes: ((None, 12), (None, 1)), types: (tf.float64, tf.int64)>"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset_train = tf.data.Dataset.from_tensor_slices((x_train.values, y_train.values))\n",
    "\n",
    "dataset_train = dataset_train.batch(16)\n",
    "\n",
    "dataset_train.shuffle(128)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**If your working with tensorflow using large scale datasets that's what you do in the real world you won't work with your data in the form of numpy arrays.**\n",
    "\n",
    "\n",
    "**Instead you will use tf.data.Dataset converting your model to datasets allows you to train your model in a distributed manner using multiple devices. we will create our training dataset from_tensor_slices that we have x_train,y_train.** \n",
    "\n",
    "\n",
    "**we want our training data to be fed in batches of 16(it can vary) records to our model and we will shuffle our training data using a buffer of size 128(it can vary)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_epochs = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.6821 - accuracy: 0.5381 - precision: 0.3523 - recall: 0.4026\n",
      "Epoch 2/10\n",
      "14/14 [==============================] - 0s 2ms/step - loss: 0.6540 - accuracy: 0.6188 - precision: 0.4487 - recall: 0.4545\n",
      "Epoch 3/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.6165 - accuracy: 0.6637 - precision: 0.5139 - recall: 0.4805\n",
      "Epoch 4/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.6219 - accuracy: 0.6368 - precision: 0.4667 - recall: 0.3636\n",
      "Epoch 5/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5830 - accuracy: 0.6816 - precision: 0.5429 - recall: 0.4935\n",
      "Epoch 6/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5888 - accuracy: 0.6682 - precision: 0.5246 - recall: 0.4156\n",
      "Epoch 7/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5702 - accuracy: 0.6816 - precision: 0.5500 - recall: 0.4286\n",
      "Epoch 8/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5648 - accuracy: 0.6861 - precision: 0.5614 - recall: 0.4156\n",
      "Epoch 9/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5617 - accuracy: 0.6502 - precision: 0.4912 - recall: 0.3636\n",
      "Epoch 10/10\n",
      "14/14 [==============================] - 0s 3ms/step - loss: 0.5503 - accuracy: 0.6771 - precision: 0.5439 - recall: 0.4026\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x19597665550>"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fit(dataset_train, epochs = num_epochs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset_val = tf.data.Dataset.from_tensor_slices((x_val.values, y_val.values))\n",
    "\n",
    "dataset_val = dataset_val.batch(16)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"functional_3\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_2 (InputLayer)         [(None, 12)]              0         \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 16)                208       \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 8)                 136       \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 353\n",
      "Trainable params: 353\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "Epoch 1/10\n",
      "14/14 [==============================] - 1s 58ms/step - loss: 0.8594 - accuracy: 0.3857 - precision_1: 0.3485 - recall_1: 0.8961 - val_loss: 0.8612 - val_accuracy: 0.2500 - val_precision_1: 0.2059 - val_recall_1: 0.7000\n",
      "Epoch 2/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.7986 - accuracy: 0.4126 - precision_1: 0.3448 - recall_1: 0.7792 - val_loss: 0.8159 - val_accuracy: 0.2500 - val_precision_1: 0.1875 - val_recall_1: 0.6000\n",
      "Epoch 3/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.7892 - accuracy: 0.3901 - precision_1: 0.3234 - recall_1: 0.7013 - val_loss: 0.7773 - val_accuracy: 0.3000 - val_precision_1: 0.2000 - val_recall_1: 0.6000\n",
      "Epoch 4/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.7321 - accuracy: 0.4664 - precision_1: 0.3500 - recall_1: 0.6364 - val_loss: 0.7493 - val_accuracy: 0.4250 - val_precision_1: 0.2174 - val_recall_1: 0.5000\n",
      "Epoch 5/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.7192 - accuracy: 0.5336 - precision_1: 0.3937 - recall_1: 0.6494 - val_loss: 0.7246 - val_accuracy: 0.4500 - val_precision_1: 0.1667 - val_recall_1: 0.3000\n",
      "Epoch 6/10\n",
      "14/14 [==============================] - 0s 4ms/step - loss: 0.7105 - accuracy: 0.5291 - precision_1: 0.3793 - recall_1: 0.5714 - val_loss: 0.7060 - val_accuracy: 0.5000 - val_precision_1: 0.1875 - val_recall_1: 0.3000\n",
      "Epoch 7/10\n",
      "14/14 [==============================] - 0s 4ms/step - loss: 0.6574 - accuracy: 0.6502 - precision_1: 0.4946 - recall_1: 0.5974 - val_loss: 0.6911 - val_accuracy: 0.5500 - val_precision_1: 0.2143 - val_recall_1: 0.3000\n",
      "Epoch 8/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.6611 - accuracy: 0.6143 - precision_1: 0.4494 - recall_1: 0.5195 - val_loss: 0.6779 - val_accuracy: 0.6000 - val_precision_1: 0.2500 - val_recall_1: 0.3000\n",
      "Epoch 9/10\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.6462 - accuracy: 0.6502 - precision_1: 0.4930 - recall_1: 0.4545 - val_loss: 0.6665 - val_accuracy: 0.6000 - val_precision_1: 0.2000 - val_recall_1: 0.2000\n",
      "Epoch 10/10\n",
      "14/14 [==============================] - 0s 4ms/step - loss: 0.6421 - accuracy: 0.6188 - precision_1: 0.4474 - recall_1: 0.4416 - val_loss: 0.6560 - val_accuracy: 0.6250 - val_precision_1: 0.2222 - val_recall_1: 0.2000\n"
     ]
    }
   ],
   "source": [
    "model = build_and_compile_model()\n",
    "\n",
    "training_history = model.fit(dataset_train, epochs = num_epochs, validation_data = dataset_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['loss', 'accuracy', 'precision_1', 'recall_1', 'val_loss', 'val_accuracy', 'val_precision_1', 'val_recall_1'])"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_history.history.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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35uQkMCECRMue43u3bsXV7gAPPDAA9SpU4f09PRiPa+IiHgftVPeTWNkRMQ1VatWZf369QA8+eSTREZG8vDDD2fuT01NJSQk59tUXFwccXFxl73GihUriidYID09ndmzZ1OvXj2WLl1KfHx8sZ07q7S0NIKDg0vk3CIikn9qp3LmLe2UemRExKvcfvvtPPjgg/Tp04dJkyaxevVqunfvTvv27enevTtbt24FYPHixVx33XWA07iMGTOG+Ph4GjVqxKuvvpp5vsjIyMzj4+PjGTZsGC1atOCWW27BWgvAggULaNGiBT179mTChAmZ583u66+/pk2bNowfP57p06dnvn7gwAFuuOEGYmJiiImJyWyU3nvvPdq1a0dMTAyjRo3K/HwzZ87MMb4+ffpw880307ZtWwAGDx5Mx44dad26NVOnTs18z+eff06HDh2IiYnhqquuIj09naZNm3Lo0CHAaciaNGlCcnJyYf8YREQkF2qnvKedUo+MiADwp/mJfL/veLGes1XtCvxxYOsCv++HH35g0aJFBAcHc/z4cZYuXUpISAiLFi3i8ccfZ9asWZe8Z8uWLXz99decOHGC5s2bM378+EumcFy3bh2JiYnUrl2bHj16sHz5cuLi4hg7dixLly4lOjqaESNG5BrX9OnTGTFiBIMGDeLxxx/n/PnzhIaGMmHCBHr37s3s2bNJS0sjJSWFxMREnnnmGZYvX05UVBRHjhy57OdevXo1mzZtypyx5Z133qFKlSqcPn2aTp06MXToUNLT07nrrrsy4z1y5AhBQUGMHDmSDz74gN/85jcsWrSImJgYoqKiCvjNi4h4L7VTaqeyU4+MiHid4cOHZ3ZZHzt2jOHDh9OmTRsmTpxIYmJiju8ZMGAAZcuWJSoqiurVq3PgwIFLjuncuTN169YlKCiI2NhYkpKS2LJlC40aNcq8KefWQJw7d44FCxYwePBgKlSoQJcuXfjiiy8A+Oqrrxg/fjwAwcHBVKxYka+++ophw4Zl3qSrVKly2c/duXPni6adfPXVV4mJiaFr167s3r2bbdu28e2333LFFVdkHpdx3jFjxvDee+8BTsMyevToy17Pnxhj+hpjthpjthtjHsthf2VjzGxjzHfGmNXGmDZuxCki/kHtlMPtdko9MiICUKhfpEpKRERE5uMnnniCPn36MHv2bJKSknKt9y1btmzm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\n",
      "text/plain": [
       "<Figure size 1008x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_acc = training_history.history['accuracy']\n",
    "train_loss = training_history.history['loss']\n",
    "\n",
    "precision = training_history.history['precision_1']\n",
    "recall = training_history.history['recall_1']\n",
    "\n",
    "epochs_range = range(num_epochs)\n",
    "\n",
    "plt.figure(figsize = (14,8))\n",
    "\n",
    "plt.subplot(1,2,1)\n",
    "\n",
    "plt.plot(epochs_range, train_acc, label = 'Training Accuracy')\n",
    "plt.plot(epochs_range, train_loss, label = 'Training Loss')\n",
    "\n",
    "plt.title('Accuracy and Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(1,2,2)\n",
    "\n",
    "plt.plot(epochs_range, precision, label = 'Training Accuracy')\n",
    "plt.plot(epochs_range, recall,    label = 'Training Loss')\n",
    "\n",
    "plt.title('Precision and Recall')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.49450436],\n",
       "       [0.473082  ],\n",
       "       [0.3575297 ],\n",
       "       [0.67815506],\n",
       "       [0.51698095],\n",
       "       [0.4588448 ],\n",
       "       [0.46109888],\n",
       "       [0.38797003],\n",
       "       [0.5421597 ],\n",
       "       [0.46321738]], dtype=float32)"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = model.predict(x_test)\n",
    "\n",
    "y_pred[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = np.where(y_pred>=0.5, 1, y_pred)\n",
    "y_pred = np.where(y_pred<0.5, 0, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.],\n",
       "       [0.],\n",
       "       [0.],\n",
       "       [1.],\n",
       "       [1.],\n",
       "       [0.],\n",
       "       [0.],\n",
       "       [0.],\n",
       "       [1.],\n",
       "       [0.]], dtype=float32)"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_results = pd.DataFrame({'y_test':y_test.values.flatten(),\n",
    "                            'y_pred':y_pred.flatten().astype('int32')},\n",
    "                           index = range(len(y_pred)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>y_test</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y_pred</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "y_test   0  1\n",
       "y_pred       \n",
       "0       30  6\n",
       "1        4  7"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.crosstab(pred_results.y_pred,pred_results.y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7872340425531915"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6363636363636364"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* The number of positive predictions by our model that were correct"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5384615384615384"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* The number of postive values in the dataset that were correctly identify by our model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [],
   "source": [
    "ckpt_path = 'C:/Users/G ANIL/Neural Networks/Neural Networks Janani Ravi/Part II/Untitled Folder'\n",
    "ckpt_dir = os.path.dirname(ckpt_path)\n",
    "\n",
    "\n",
    "ckpt_callback = tf.keras.callbacks.ModelCheckpoint(filepath = ckpt_path,\n",
    "                                                  save_weights_only = True,\n",
    "                                                  save_freq = 3,\n",
    "                                                  verbose = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"functional_7\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_4 (InputLayer)         [(None, 12)]              0         \n",
      "_________________________________________________________________\n",
      "dense_9 (Dense)              (None, 16)                208       \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_10 (Dense)             (None, 8)                 136       \n",
      "_________________________________________________________________\n",
      "dense_11 (Dense)             (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 353\n",
      "Trainable params: 353\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x1959c3b8190>"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = build_and_compile_model()\n",
    "\n",
    "model.fit(dataset_train,epochs = num_epochs, validation_data = dataset_val,\n",
    "         verbose = False, callbacks = [ckpt_callback])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7021276595744681"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = model.predict(x_test)\n",
    "\n",
    "y_pred = np.where(y_pred>=0.5, 1, y_pred)\n",
    "y_pred = np.where(y_pred<0.5, 0, y_pred)\n",
    "\n",
    "accuracy_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"functional_9\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_5 (InputLayer)         [(None, 12)]              0         \n",
      "_________________________________________________________________\n",
      "dense_12 (Dense)             (None, 16)                208       \n",
      "_________________________________________________________________\n",
      "dropout_4 (Dropout)          (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_13 (Dense)             (None, 8)                 136       \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 353\n",
      "Trainable params: 353\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x19591b1c160>"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reloaded_model = build_and_compile_model()\n",
    "\n",
    "reloaded_model.load_weights(ckpt_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.723404255319149"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = reloaded_model.predict(x_test)\n",
    "\n",
    "y_pred = np.where(y_pred>=0.5, 1, y_pred)\n",
    "y_pred = np.where(y_pred<0.5, 0, y_pred)\n",
    "\n",
    "accuracy_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "14/14 [==============================] - 0s 2ms/step - loss: 0.4963 - accuracy: 0.7085 - precision_4: 0.6364 - recall_4: 0.3636 - val_loss: 0.4182 - val_accuracy: 0.8000 - val_precision_4: 0.6250 - val_recall_4: 0.5000\n",
      "Epoch 2/5\n",
      "14/14 [==============================] - 0s 5ms/step - loss: 0.5050 - accuracy: 0.7130 - precision_4: 0.6970 - recall_4: 0.2987 - val_loss: 0.4158 - val_accuracy: 0.8000 - val_precision_4: 0.6250 - val_recall_4: 0.5000\n",
      "Epoch 3/5\n",
      "14/14 [==============================] - 0s 4ms/step - loss: 0.4788 - accuracy: 0.7175 - precision_4: 0.7059 - recall_4: 0.3117 - val_loss: 0.4116 - val_accuracy: 0.8000 - val_precision_4: 0.6250 - val_recall_4: 0.5000\n",
      "Epoch 4/5\n",
      "14/14 [==============================] - 0s 7ms/step - loss: 0.5062 - accuracy: 0.7265 - precision_4: 0.6739 - recall_4: 0.4026 - val_loss: 0.4103 - val_accuracy: 0.8000 - val_precision_4: 0.6250 - val_recall_4: 0.5000\n",
      "Epoch 5/5\n",
      "14/14 [==============================] - 0s 6ms/step - loss: 0.4828 - accuracy: 0.6996 - precision_4: 0.6316 - recall_4: 0.3117 - val_loss: 0.4083 - val_accuracy: 0.8000 - val_precision_4: 0.6250 - val_recall_4: 0.5000\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x195974ada00>"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reloaded_model.fit(dataset_train, epochs = 5, validation_data = dataset_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7659574468085106"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = reloaded_model.predict(x_test)\n",
    "\n",
    "y_pred = np.where(y_pred>=0.5, 1, y_pred)\n",
    "y_pred = np.where(y_pred<0.5, 0, y_pred)\n",
    "\n",
    "accuracy_score(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"functional_11\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_6 (InputLayer)         [(None, 12)]              0         \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 16)                208       \n",
      "_________________________________________________________________\n",
      "dropout_5 (Dropout)          (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_16 (Dense)             (None, 8)                 136       \n",
      "_________________________________________________________________\n",
      "dense_17 (Dense)             (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 353\n",
      "Trainable params: 353\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = build_and_compile_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "log_dir = \"logs/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n",
    "\n",
    "tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir = log_dir, histogram_freq = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\G ANIL\\anaconda3\\lib\\site-packages\\tensorflow\\python\\ops\\summary_ops_v2.py:1277: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.\n",
      "Instructions for updating:\n",
      "use `tf.profiler.experimental.stop` instead.\n",
      "WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0168s vs `on_train_batch_end` time: 1.1721s). Check your callbacks.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x1959deed4c0>"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fit(dataset_train, epochs = num_epochs, validation_data = dataset_val, verbose = False,\n",
    "         callbacks = [tensorboard_callback])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext tensorboard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Reusing TensorBoard on port 6006 (pid 6300), started 0:02:14 ago. (Use '!kill 6300' to kill it.)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "      <iframe id=\"tensorboard-frame-f08c3b713755275c\" width=\"100%\" height=\"800\" frameborder=\"0\">\n",
       "      </iframe>\n",
       "      <script>\n",
       "        (function() {\n",
       "          const frame = document.getElementById(\"tensorboard-frame-f08c3b713755275c\");\n",
       "          const url = new URL(\"/\", window.location);\n",
       "          const port = 6006;\n",
       "          if (port) {\n",
       "            url.port = port;\n",
       "          }\n",
       "          frame.src = url;\n",
       "        })();\n",
       "      </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%tensorboard --logdir logs/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
